package manejador;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import persistencia.Conexion;

import entidad.Estudiante;

import interfaz.IEntidad;
import interfaz.IManejador;

public class ManejadorDeEstudiante implements IManejador {

	private ResultSet rs = null;
	private PreparedStatement stmt = null;
	private static ManejadorDeEstudiante instancia = null;
	private Estudiante estudiante = null;
	private List<IEntidad> estudiantes = null;
	private List<IEntidad> estudiantesPorCurso = null;

	private Conexion conexion = null;

	private ManejadorDeEstudiante() {
		conexion = Conexion.getInstancia();

	}

	public static ManejadorDeEstudiante getInstancia() {
		if (instancia == null) {
			instancia = new ManejadorDeEstudiante();
		}
		return instancia;
	}

	@Override
	public int agregar(IEntidad entidad) {
		int fila = 0;
		String sql = "INSERT INTO sistema_informacion.estudiante ( nombre, apellido, sexo, direccion, telefono, nombre_tutor, apellido_tutor, telefono_tutor,estatus) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?,?);";
		estudiante = (Estudiante) entidad;
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, estudiante.getNombre());
			stmt.setString(2, estudiante.getApellido());
			stmt.setString(3, estudiante.getSexo());
			stmt.setString(4, estudiante.getDireccion());
			stmt.setString(5, estudiante.getTelefono());
			stmt.setString(6, estudiante.getNombreTutor());
			stmt.setString(7, estudiante.getApellidoTutor());
			stmt.setString(8, estudiante.getTelefonoTutor());
			stmt.setString(9, estudiante.getEstatus());
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return fila;
	}

	public int agregarConEmail(IEntidad entidad) {
		int fila = 0;
		String sql = "INSERT INTO sistema_informacion.estudiante ( nombre, apellido, sexo, direccion, telefono, nombre_tutor, apellido_tutor, telefono_tutor,estatus,email) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?,?,?);";
		estudiante = (Estudiante) entidad;
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, estudiante.getNombre());
			stmt.setString(2, estudiante.getApellido());
			stmt.setString(3, estudiante.getSexo());
			stmt.setString(4, estudiante.getDireccion());
			stmt.setString(5, estudiante.getTelefono());
			stmt.setString(6, estudiante.getNombreTutor());
			stmt.setString(7, estudiante.getApellidoTutor());
			stmt.setString(8, estudiante.getTelefonoTutor());
			stmt.setString(9, estudiante.getEstatus());
			stmt.setString(10, estudiante.getEmail());
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return fila;
	}

	@Override
	public int eliminar(int id) {
		int fila = 0;
		String sql = "DELETE FROM sistema_informacion.estudiante WHERE id_estudiante = ? ;";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setInt(1, id);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return fila;
	}

	@Override
	public List<IEntidad> getEntidad() {
		estudiantes = new ArrayList<IEntidad>();

		String sql = "SELECT * FROM sistema_informacion.estudiante";
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				IEntidad estudiante = new Estudiante(
						rs.getInt("id_estudiante"), rs.getString("nombre"), rs
								.getString("apellido"), rs.getString("sexo"),
						rs.getString("direccion"), rs.getString("telefono"), rs
								.getString("nombre_tutor"), rs
								.getString("apellido_tutor"), rs
								.getString("telefono_tutor"), rs
								.getString("estatus"));
				estudiantes.add(estudiante);

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return estudiantes;
	}

	@Override
	public IEntidad getEntidadPorId(int id) {
		String sql = "SELECT * FROM estudiante WHERE id_estudiante =" + id;
		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				estudiante = new Estudiante(rs.getInt("id_estudiante"), rs
						.getString("nombre"), rs.getString("apellido"), rs
						.getString("sexo"), rs.getString("direccion"), rs
						.getString("telefono"), rs.getString("nombre_tutor"),
						rs.getString("apellido_tutor"), rs
								.getString("telefono_tutor"), rs
								.getString("estatus"), rs.getString("email"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return estudiante;
	}

	@Override
	public int modificar(IEntidad entidad, int id) {
		int fila = 0;
		estudiante = (Estudiante) entidad;
		String sql = "UPDATE sistema_informacion.estudiante  SET nombre = ? , apellido = ?, sexo = ?, direccion = ? , telefono = ? , nombre_tutor = ?, apellido_tutor = ? , telefono_tutor = ?, estatus= ?, email=? WHERE id_estudiante = ?;";
		stmt = conexion.hacerEnunciado(sql);

		try {
			stmt.setString(1, estudiante.getNombre());
			stmt.setString(2, estudiante.getApellido());
			stmt.setString(3, estudiante.getSexo());
			stmt.setString(4, estudiante.getDireccion());
			stmt.setString(5, estudiante.getTelefono());
			stmt.setString(6, estudiante.getNombreTutor());
			stmt.setString(7, estudiante.getApellidoTutor());
			stmt.setString(8, estudiante.getTelefonoTutor());
			stmt.setString(9, estudiante.getEstatus());
			stmt.setString(10, estudiante.getEmail());
			stmt.setInt(11, id);
			fila = stmt.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		}

		return fila;
	}

	public List<IEntidad> getEntidadDinamica(String parametro) {
		estudiantes = new ArrayList<IEntidad>();
		String sql = "";
		if (parametro.equals("ACTIVO")) {
			sql = "SELECT * FROM sistema_informacion.estudiante WHERE estatus="
					+ "'" + parametro + "'";

		} else if (parametro.equals("INACTIVO")) {
			sql = "SELECT * FROM sistema_informacion.estudiante WHERE estatus="
					+ "'" + parametro + "'";

		} else if (parametro.equals("TODOS")) {
			sql = "SELECT * FROM sistema_informacion.estudiante";
		}

		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);

		try {
			while (rs.next()) {
				IEntidad estudiante = new Estudiante(
						rs.getInt("id_estudiante"), rs.getString("nombre"), rs
								.getString("apellido"), rs.getString("sexo"),
						rs.getString("direccion"), rs.getString("telefono"), rs
								.getString("nombre_tutor"), rs
								.getString("apellido_tutor"), rs
								.getString("telefono_tutor"), rs
								.getString("estatus"));
				estudiantes.add(estudiante);

			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return estudiantes;
	}

	public int cambiarEstatus(int id) {
		int fila = 0;
		estudiante = (Estudiante) ManejadorDeEstudiante.getInstancia()
				.getEntidadPorId(id);
		String estatus = estudiante.getEstatus().equalsIgnoreCase("ACTIVO") ? "INACTIVO"
				: "ACTIVO";
		String sql = "UPDATE estudiante SET estatus=? WHERE id_estudiante="
				+ id;
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setString(1, estatus);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return fila;
	}

	public int agregarEstudianteCurso(int idCurso, int idEstudiante) {
		int fila = 0;
		String sql = "INSERT INTO sistema_informacion.curso_estudiante (id_curso, id_estudiante) VALUES (?, ?);";
		stmt = conexion.hacerEnunciado(sql);
		try {
			stmt.setInt(1, idCurso);
			stmt.setInt(2, idEstudiante);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return fila;
	}

	public List<IEntidad> getEstudiantesPorCurso(int idCurso) {
		estudiantesPorCurso = new ArrayList<IEntidad>();
		String sql = "SELECT curso.id_curso,estudiante.*,curso_estudiante.* FROM curso,estudiante,curso_estudiante WHERE curso.id_curso=curso_estudiante.id_curso AND estudiante.id_estudiante=curso_estudiante.id_estudiante AND curso.id_curso="
				+ idCurso;

		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);
		try {
			while (rs.next()) {
				IEntidad estudiante = new Estudiante(
						rs.getInt("id_estudiante"), rs.getString("nombre"), rs
								.getString("apellido"), rs.getString("sexo"),
						rs.getString("direccion"), rs.getString("telefono"), rs
								.getString("nombre_tutor"), rs
								.getString("apellido_tutor"), rs
								.getString("telefono_tutor"), rs
								.getString("estatus"));
				estudiantesPorCurso.add(estudiante);

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return estudiantesPorCurso;

	}

	public List<IEntidad> getEntidadDinamicaEstudiantesPorCurso(
			String parametro, int idCurso) {
		estudiantesPorCurso = new ArrayList<IEntidad>();
		String sql = "";
		if (parametro.equalsIgnoreCase("ACTIVO")) {
			sql = "SELECT curso.id_curso,estudiante.*,curso_estudiante.* FROM curso,estudiante,curso_estudiante WHERE curso.id_curso=curso_estudiante.id_curso AND estudiante.id_estudiante=curso_estudiante.id_estudiante AND estudiante.estatus= "
					+ "'" + parametro + "'" + "AND curso.id_curso=" + idCurso;

		} else if (parametro.equalsIgnoreCase("INACTIVO")) {
			sql = "SELECT curso.id_curso,estudiante.*,curso_estudiante.* FROM curso,estudiante,curso_estudiante WHERE curso.id_curso=curso_estudiante.id_curso AND estudiante.id_estudiante=curso_estudiante.id_estudiante AND estudiante.estatus= "
					+ "'" + parametro + "'" + "AND curso.id_curso=" + idCurso;

		} else if (parametro.equalsIgnoreCase("TODOS")) {
			sql = "SELECT curso.id_curso,estudiante.*,curso_estudiante.* FROM curso,estudiante,curso_estudiante WHERE curso.id_curso=curso_estudiante.id_curso AND estudiante.id_estudiante=curso_estudiante.id_estudiante  AND curso.id_curso="
					+ idCurso;
		}

		stmt = conexion.hacerEnunciado(sql);
		rs = conexion.hacerConsulta(sql);

		try {
			while (rs.next()) {
				IEntidad estudiante = new Estudiante(
						rs.getInt("id_estudiante"), rs.getString("nombre"), rs
								.getString("apellido"), rs.getString("sexo"),
						rs.getString("direccion"), rs.getString("telefono"), rs
								.getString("nombre_tutor"), rs
								.getString("apellido_tutor"), rs
								.getString("telefono_tutor"), rs
								.getString("estatus"));
				estudiantesPorCurso.add(estudiante);

			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return estudiantesPorCurso;
	}

	@Override
	public int agregarEmpleadoConCelular(IEntidad entidad) {
		// TODO Auto-generated method stub
		return 0;
	}

}
